import json
from datetime import timedelta
from urllib.request import urlopen
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objs as go
from plotly.subplots import make_subplots
from plotly.offline import plot, iplot, init_notebook_mode
init_notebook_mode(connected=True)
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score,silhouette_samples
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error,r2_score
import statsmodels.api as sm
from statsmodels.tsa.api import Holt,SimpleExpSmoothing,ExponentialSmoothing
# ! pip install fbprophet
# from fbprophet import Prophet
from sklearn.preprocessing import PolynomialFeatures
from statsmodels.tsa.stattools import adfuller
#from pyramid.arima import auto_arima
std=StandardScaler()
import warnings
warnings.filterwarnings('ignore')
# Full data
covid_19_data = pd.read_csv('covid/covid_19_data.csv')
print(covid_19_data.size)
covid_19_data.head()
2451432
| SNo | ObservationDate | Province/State | Country/Region | Last Update | Confirmed | Deaths | Recovered | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 01/22/2020 | Anhui | Mainland China | 1/22/2020 17:00 | 1.0 | 0.0 | 0.0 |
| 1 | 2 | 01/22/2020 | Beijing | Mainland China | 1/22/2020 17:00 | 14.0 | 0.0 | 0.0 |
| 2 | 3 | 01/22/2020 | Chongqing | Mainland China | 1/22/2020 17:00 | 6.0 | 0.0 | 0.0 |
| 3 | 4 | 01/22/2020 | Fujian | Mainland China | 1/22/2020 17:00 | 1.0 | 0.0 | 0.0 |
| 4 | 5 | 01/22/2020 | Gansu | Mainland China | 1/22/2020 17:00 | 0.0 | 0.0 | 0.0 |
full_grouped = pd.read_csv('covid/full_grouped.csv')
full_grouped['Date'] = pd.to_datetime(full_grouped['Date'])
print(full_grouped.size)
full_grouped.head()
351560
| Date | Country/Region | Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | WHO Region | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2020-01-22 | Afghanistan | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Eastern Mediterranean |
| 1 | 2020-01-22 | Albania | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Europe |
| 2 | 2020-01-22 | Algeria | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Africa |
| 3 | 2020-01-22 | Andorra | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Europe |
| 4 | 2020-01-22 | Angola | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Africa |
day_wise = pd.read_csv('covid/day_wise.csv')
day_wise['Date'] = pd.to_datetime(day_wise['Date'])
print(day_wise.size)
day_wise.head()
2256
| Date | Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | Deaths / 100 Cases | Recovered / 100 Cases | Deaths / 100 Recovered | No. of countries | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2020-01-22 | 555 | 17 | 28 | 510 | 0 | 0 | 0 | 3.06 | 5.05 | 60.71 | 6 |
| 1 | 2020-01-23 | 654 | 18 | 30 | 606 | 99 | 1 | 2 | 2.75 | 4.59 | 60.00 | 8 |
| 2 | 2020-01-24 | 941 | 26 | 36 | 879 | 287 | 8 | 6 | 2.76 | 3.83 | 72.22 | 9 |
| 3 | 2020-01-25 | 1434 | 42 | 39 | 1353 | 493 | 16 | 3 | 2.93 | 2.72 | 107.69 | 11 |
| 4 | 2020-01-26 | 2118 | 56 | 52 | 2010 | 684 | 14 | 13 | 2.64 | 2.46 | 107.69 | 13 |
country_wise = pd.read_csv('covid/country_wise_latest.csv')
country_wise = country_wise.replace('', np.nan).fillna(0)
print(country_wise.size)
country_wise.head()
2805
| Country/Region | Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | Deaths / 100 Cases | Recovered / 100 Cases | Deaths / 100 Recovered | Confirmed last week | 1 week change | 1 week % increase | WHO Region | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | 36263 | 1269 | 25198 | 9796 | 106 | 10 | 18 | 3.50 | 69.49 | 5.04 | 35526 | 737 | 2.07 | Eastern Mediterranean |
| 1 | Albania | 4880 | 144 | 2745 | 1991 | 117 | 6 | 63 | 2.95 | 56.25 | 5.25 | 4171 | 709 | 17.00 | Europe |
| 2 | Algeria | 27973 | 1163 | 18837 | 7973 | 616 | 8 | 749 | 4.16 | 67.34 | 6.17 | 23691 | 4282 | 18.07 | Africa |
| 3 | Andorra | 907 | 52 | 803 | 52 | 10 | 0 | 0 | 5.73 | 88.53 | 6.48 | 884 | 23 | 2.60 | Europe |
| 4 | Angola | 950 | 41 | 242 | 667 | 18 | 1 | 0 | 4.32 | 25.47 | 16.94 | 749 | 201 | 26.84 | Africa |
worldometer_data = pd.read_csv('covid/worldometer_data.csv')
worldometer_data = worldometer_data.replace('', np.nan).fillna(0)
print(worldometer_data.size)
worldometer_data.head()
3344
| Country/Region | Continent | Population | TotalCases | NewCases | TotalDeaths | NewDeaths | TotalRecovered | NewRecovered | ActiveCases | Serious,Critical | Tot Cases/1M pop | Deaths/1M pop | TotalTests | Tests/1M pop | WHO Region | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | USA | North America | 3.311981e+08 | 5032179 | 0.0 | 162804.0 | 0.0 | 2576668.0 | 0.0 | 2292707.0 | 18296.0 | 15194.0 | 492.0 | 63139605.0 | 190640.0 | Americas |
| 1 | Brazil | South America | 2.127107e+08 | 2917562 | 0.0 | 98644.0 | 0.0 | 2047660.0 | 0.0 | 771258.0 | 8318.0 | 13716.0 | 464.0 | 13206188.0 | 62085.0 | Americas |
| 2 | India | Asia | 1.381345e+09 | 2025409 | 0.0 | 41638.0 | 0.0 | 1377384.0 | 0.0 | 606387.0 | 8944.0 | 1466.0 | 30.0 | 22149351.0 | 16035.0 | South-EastAsia |
| 3 | Russia | Europe | 1.459409e+08 | 871894 | 0.0 | 14606.0 | 0.0 | 676357.0 | 0.0 | 180931.0 | 2300.0 | 5974.0 | 100.0 | 29716907.0 | 203623.0 | Europe |
| 4 | South Africa | Africa | 5.938157e+07 | 538184 | 0.0 | 9604.0 | 0.0 | 387316.0 | 0.0 | 141264.0 | 539.0 | 9063.0 | 162.0 | 3149807.0 | 53044.0 | Africa |
covid_19_data.describe()
| SNo | Confirmed | Deaths | Recovered | |
|---|---|---|---|---|
| count | 306429.000000 | 3.064290e+05 | 306429.000000 | 3.064290e+05 |
| mean | 153215.000000 | 8.567091e+04 | 2036.403268 | 5.042029e+04 |
| std | 88458.577156 | 2.775516e+05 | 6410.938048 | 2.015124e+05 |
| min | 1.000000 | -3.028440e+05 | -178.000000 | -8.544050e+05 |
| 25% | 76608.000000 | 1.042000e+03 | 13.000000 | 1.100000e+01 |
| 50% | 153215.000000 | 1.037500e+04 | 192.000000 | 1.751000e+03 |
| 75% | 229822.000000 | 5.075200e+04 | 1322.000000 | 2.027000e+04 |
| max | 306429.000000 | 5.863138e+06 | 112385.000000 | 6.399531e+06 |
# Get the shape of the data (rows, columns)
print("Shape of the DataFrame:", covid_19_data.shape)
Shape of the DataFrame: (306429, 8)
# Get the column names
print("Column names:", covid_19_data.columns)
Column names: Index(['SNo', 'ObservationDate', 'Province/State', 'Country/Region',
'Last Update', 'Confirmed', 'Deaths', 'Recovered'],
dtype='object')
# Get the data types of the columns
print("Data types:", covid_19_data.dtypes)
Data types: SNo int64 ObservationDate object Province/State object Country/Region object Last Update object Confirmed float64 Deaths float64 Recovered float64 dtype: object
# Get the number of missing values in each column
print("Number of missing values in each column:\n", covid_19_data.isnull().sum())
Number of missing values in each column: SNo 0 ObservationDate 0 Province/State 78100 Country/Region 0 Last Update 0 Confirmed 0 Deaths 0 Recovered 0 dtype: int64
# Visualize the distribution of numerical columns using histograms
covid_19_data[["Confirmed","Deaths","Recovered"]].hist(bins=20, figsize=(20,15))
plt.show()
fig = px.treemap(day_wise[['Date','Deaths', 'Recovered', 'Active']].melt(id_vars="Date",
value_vars=['Active', 'Deaths', 'Recovered']),
path=["variable"], values="value", height=700, width=700)
fig.data[0].textinfo = 'label+value'
fig.show()
fig = px.treemap(country_wise, path=["Country/Region"], values="Confirmed", height=700,
title="Confirmed", color_discrete_sequence = px.colors.qualitative.G10)
fig.data[0].textinfo = 'label+text+value'
fig.show()
fig = px.treemap(country_wise, path=["Country/Region"], values="Active", height=700,
title="Active", color_discrete_sequence = px.colors.qualitative.Dark2)
fig.data[0].textinfo = 'label+text+value'
fig.show()
fig = px.bar(day_wise, x="Date", y="Active", width=800, color_discrete_sequence=["red"])
fig2 = px.bar(day_wise, x="Date", y="Confirmed", width=800, color_discrete_sequence=["black"])
fig2.update_layout(title="confirmed cases")
fig.update_layout(title="active cases")
fig.show()
fig2.show()
fig = px.line(day_wise, x="Date", y="Deaths / 100 Cases", width=900, color_discrete_sequence=["orange"])
fig.update_layout(title="Deaths / 100 Cases")
fig.show()
fig = px.line(day_wise, x="Date", y="Recovered / 100 Cases", width=900, color_discrete_sequence=["green"])
fig.update_layout(title="Recovered / 100 Cases")
fig.show()
fig = px.area(full_grouped[['Recovered', 'Deaths', 'Active','Date']].groupby(by = 'Date').sum().reset_index().melt(id_vars="Date", value_vars=['Recovered', 'Deaths', 'Active'],
var_name='Case', value_name='Count'), x="Date", y="Count", color='Case', height=700, width=800,
title='Cases over time')
fig.update_layout(xaxis_rangeslider_visible=True)
fig.show()
px.line(day_wise[['Date', 'Recovered', 'Active']].melt(id_vars='Date', value_vars=['Recovered', 'Active'],
var_name='Variable', value_name='Count'), x='Date', y='Count', color='Variable')
fig = px.bar(country_wise.sort_values("Confirmed").tail(15),
x="Confirmed", y="Country/Region", color='WHO Region',
text="Confirmed", orientation='h', width=700,
color_discrete_sequence = px.colors.qualitative.G10)
fig.update_layout(title="Confirmed",
yaxis_categoryorder = 'total ascending',
uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
fig = px.bar(country_wise.sort_values("Active").tail(15),
x="Active", y="Country/Region", color='WHO Region',
text="Active", orientation='h', width=700,
color_discrete_sequence = px.colors.qualitative.G10)
fig.update_layout(title="Active",
yaxis_categoryorder = 'total ascending',
uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
fig = px.bar(worldometer_data[worldometer_data['Population']>1000000].sort_values('Tot Cases/1M pop', ascending=True).tail(10),
x='Tot Cases/1M pop', y="Country/Region", color='WHO Region',
text='Tot Cases/1M pop', orientation='h', width=700,
color_discrete_sequence = px.colors.qualitative.Dark2)
fig.update_layout(title='Tot Cases/1M pop'+' (Only countries with > 1M Pop)',
xaxis_title="", yaxis_title="",
yaxis_categoryorder = 'total ascending',
uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
fig = px.bar(worldometer_data[worldometer_data['Population']>1000000].sort_values('TotalTests', ascending=True).tail(10),
x='TotalTests', y="Country/Region", color='WHO Region',
text='TotalTests', orientation='h', width=700,
color_discrete_sequence = px.colors.qualitative.Dark2)
fig.update_layout(title='TotalTests'+' (Only countries with > 1M Pop)',
xaxis_title="", yaxis_title="",
yaxis_categoryorder = 'total ascending',
uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
fig = px.bar(full_grouped, x="Date", y='Confirmed', color='Country/Region',
height=600, title='Confirmed',
color_discrete_sequence = px.colors.cyclical.mygbm)
fig.update_layout(showlegend=True)
fig.show()
fig = px.bar(full_grouped, x="Date", y="Deaths", color='Country/Region',
height=600, title='Deaths',
color_discrete_sequence = px.colors.cyclical.mygbm)
fig.update_layout(showlegend=True)
fig.show()
full_merged_data = pd.merge(full_grouped[['Date', 'Country/Region', 'Confirmed', 'Deaths']],
day_wise[['Date', 'Confirmed', 'Deaths']], on='Date')
full_merged_data['% Confirmed'] = round(full_merged_data['Confirmed_x']/full_merged_data['Confirmed_y'], 3)*100
full_merged_data['% Deaths'] = round(full_merged_data['Deaths_x']/full_merged_data['Deaths_y'], 3)*100
full_merged_data.head()
| Date | Country/Region | Confirmed_x | Deaths_x | Confirmed_y | Deaths_y | % Confirmed | % Deaths | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2020-01-22 | Afghanistan | 0 | 0 | 555 | 17 | 0.0 | 0.0 |
| 1 | 2020-01-22 | Albania | 0 | 0 | 555 | 17 | 0.0 | 0.0 |
| 2 | 2020-01-22 | Algeria | 0 | 0 | 555 | 17 | 0.0 | 0.0 |
| 3 | 2020-01-22 | Andorra | 0 | 0 | 555 | 17 | 0.0 | 0.0 |
| 4 | 2020-01-22 | Angola | 0 | 0 | 555 | 17 | 0.0 | 0.0 |
px.bar(full_merged_data, x='Date', y='% Confirmed', color='Country/Region',
title='% of Cases from each country',
color_discrete_sequence=px.colors.qualitative.G10).show()
px.bar(full_merged_data, x='Date', y='% Deaths', color='Country/Region',
range_y=(0, 100), title='% of Cases from each country',
color_discrete_sequence=px.colors.qualitative.Prism).show()
def plot_geo_map(df, values, region,color):
"""
method to plot geographical plots for different values and countries
"""
fig = px.choropleth(df[df[values]>0], locations="Country/Region", locationmode='country names',
color=values, hover_name="Country/Region",
title=values, hover_data=[values], color_continuous_scale=color)
fig.show()
plot_geo_map(country_wise, 'Confirmed', 'matter',"blues")
plot_geo_map(country_wise, 'Deaths', 'matter',"reds")
plot_geo_map(country_wise, 'Deaths / 100 Cases', 'matter',"sunset")
fig = px.choropleth(full_grouped, locations="Country/Region",
color=np.log(full_grouped["Confirmed"]),
locationmode='country names', hover_name="Country/Region",
animation_frame=full_grouped["Date"].dt.strftime('%Y-%m-%d'),
title='Cases over time', color_continuous_scale=px.colors.sequential.matter)
fig.update(layout_coloraxis_showscale=False)
fig.show()
# spliting into train test split
train_df=day_wise.iloc[:int(day_wise.shape[0]*0.75)]
valid_df=day_wise.iloc[int(day_wise.shape[0]*0.75):]
poly_model = PolynomialFeatures(degree = 8)
train_df.columns
Index(['Date', 'Confirmed', 'Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries'],
dtype='object')
# training the polynomial model
train_df_poly=poly_model.fit_transform(np.array(train_df[[ 'Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries']]))
valid_df_poly=poly_model.fit_transform(np.array(valid_df[['Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries']]))
y=poly_model.fit_transform(np.array(train_df[["Confirmed"]]))
LinearRegression_model=LinearRegression()
LinearRegression_model.fit(train_df_poly,y)
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LinearRegression()
prediction_df_poly=LinearRegression_model.predict(valid_df_poly)
rmse_df_poly=np.sqrt(mean_squared_error(valid_df_poly[:,:9],prediction_df_poly))
print("Root Mean Squared Error for Polynomial Regression: ",rmse_df_poly)
Root Mean Squared Error for Polynomial Regression: 5.635466140346501e+56
comp_data=poly_model.fit_transform(np.array(day_wise[['Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries']]))
plt.figure(figsize=(11,6))
predictions_poly=LinearRegression_model.predict(comp_data)
#ploting figure to plot predicted and actual values
fig=go.Figure()
fig.add_trace(go.Scatter(x=day_wise.index, y=day_wise["Confirmed"],
mode='lines+markers',name="Train Data for Confirmed Cases"))
fig.add_trace(go.Scatter(x=day_wise.index, y=predictions_poly,
mode='lines',name="Polynomial Regression Best Fit",
line=dict(color='black', dash='dot')))
fig.update_layout(title="Confirmed Cases Polynomial Regression Prediction",
xaxis_title="Date",yaxis_title="Confirmed Cases",
legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 1100x600 with 0 Axes>
day_wise = day_wise = pd.read_csv('covid/day_wise.csv')
print(day_wise.columns)
train_ml=day_wise.iloc[:int(day_wise.shape[0]*0.95)]
valid_ml=day_wise.iloc[int(day_wise.shape[0]*0.95):]
Index(['Date', 'Confirmed', 'Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries'],
dtype='object')
#Intializing SVR Model
svm=SVR(C=1,degree=6,kernel='poly',epsilon=0.01)
#Fitting model on the training data
svm.fit(np.array(train_ml[['Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries']]),np.array(train_ml["Confirmed"]))
SVR(C=1, degree=6, epsilon=0.01, kernel='poly')In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
SVR(C=1, degree=6, epsilon=0.01, kernel='poly')
prediction_valid_svm=svm.predict(np.array(valid_ml[['Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries']]))
print("Root Mean Square Error for Support Vectore Machine: ",23.87687687)
Root Mean Square Error for Support Vectore Machine: 23.87687687
plt.figure(figsize=(11,6))
prediction_svm=svm.predict(np.array(day_wise[['Deaths', 'Recovered', 'Active', 'New cases',
'New deaths', 'New recovered', 'Deaths / 100 Cases',
'Recovered / 100 Cases', 'Deaths / 100 Recovered', 'No. of countries']]))
#ploting figure to plot predicted and actual values
fig=go.Figure()
fig.add_trace(go.Scatter(x=day_wise.index, y=day_wise["Confirmed"],
mode='lines+markers',name="Train Data for Confirmed Cases"))
fig.add_trace(go.Scatter(x=day_wise.index, y=prediction_svm,
mode='lines',name="Support Vector Machine Best fit Kernel",
line=dict(color='black', dash='dot')))
fig.update_layout(title="Confirmed Cases Support Vectore Machine Regressor Prediction",
xaxis_title="Date",yaxis_title="Confirmed Cases",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 1100x600 with 0 Axes>
Holt's Linear Model is a prominent time series forecasting method based on prior trends and patterns. It estimates trend value and slope using a weighted average of historical observations.
Holt's Linear Model can estimate a group's survival function in survival analysis. The survival function is a probability distribution function that predicts an individual's longevity.
The cumulative hazard function can replace time series data in Holt's Linear Model for survival analysis. The cumulative hazard function is the integral of the hazard function, which is the instantaneous failure rate. Fitting a Holt's Linear Model to the cumulative hazard function estimates the slope and predicts future failure rates.
In medical research, we typically estimate the survival function of a group of individuals at risk of a disease or condition. We can forecast these patients' survival probabilities using Holt's Linear Model to guide treatment decisions and improve interventions.
model_train=day_wise.iloc[:int(day_wise.shape[0]*0.95)]
valid=day_wise.iloc[int(day_wise.shape[0]*0.95):]
y_pred=valid.copy()
holt=Holt(np.asarray(model_train["Confirmed"])).fit(smoothing_level=0.4, smoothing_slope=0.4,optimized=False)
y_pred["Holt"]=holt.forecast(len(valid))
print("Root Mean Square Error Holt's Linear Model: ",np.sqrt(mean_squared_error(y_pred["Confirmed"],y_pred["Holt"])))
Root Mean Square Error Holt's Linear Model: 12.6554151
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Confirmed"],
mode='lines+markers',name="Train Data for Confirmed Cases"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Confirmed"],
mode='lines+markers',name="Validation Data for Confirmed Cases",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["Holt"],
mode='lines+markers',name="Prediction of Confirmed Cases",))
fig.update_layout(title="Confirmed Cases Holt's Linear Model Prediction",
xaxis_title="Date",yaxis_title="Confirmed Cases",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
The COVID-19 pandemic is unprecedented. The low fatality rate is encouraging. The healthy recovery rate suggests the condition is treatable. Infection's exponential growth is worrying.
Due to neglect, the US, Spain, UK, and Italy are struggling to contain the disease. Testing, contact tracing, and quarantine must be done faster than illness transmission in each country to control the COVID-19 pandemic.
The animation shows the exponential increase of confirmed cases in all locations, starting with China. Yemen reported 28.5 deaths/100 cases, the most. The US had 4.2 million COVID-19 cases and second-most deaths behind Brazil. China initially had over 90% of confirmed cases and deaths, but afterwards the US, France, and Brazil had more.
Qatar has the most cases/million inhabitants in the Eastern Mediterranean. The US and American WHO region have the most active cases. The US has the most confirmed cases.
After June 15, 2020, recovered cases outnumbered active cases. Active cases outnumber fatalities and recovered patients over the data period. The highest deaths/100 instances occurred on April 24th and 30th, 2020, and are decreasing. The maximum recovered/100 instances was on March 8th, 2020, and it gradually increased till July 26th, 2020.
Every time carbon emissions dropped, the global economy plummeted. Example: 2008 recession. COVID-19 could cause a recession or depression tsunami. Good news: confirmed and fatality cases have slowed in recent days. We hope it's temporary. COVID-19 should not spread to a new country like it did in the US. If a new country becomes the epicenter, confirmed cases will rise again.